﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using BusinessLogic;
using System.Text.RegularExpressions;

namespace thdescritorio
{
    public partial class frmGestion : Form
    {
        public frmGestion()
        {
            InitializeComponent();
        }

        private void dgvActivos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            //Editar.
            if (e.ColumnIndex == 0)
            {
                //Si hay un funcionario seleccionado...
                if (dgvActivos.Rows[e.RowIndex].Cells[2].Value.ToString() != "")
                {
                    //Cambiar 0 por el columnIndex de "Editar" ¿No se puede poner el nombre de la columna? ¬¬
                    frmEditar fEditar = new frmEditar(long.Parse(dgvActivos.Rows[e.RowIndex].Cells[2].Value.ToString())); //pasar como parámetro un long que sea el nro de funcionario a editar!
                    fEditar.Show();
                }
            }
            //Desactivar.
            else if (e.ColumnIndex == 1)
            {
                //Si hay un funcionario seleccionado.
                if (dgvActivos.Rows[e.RowIndex].Cells[2].Value.ToString() != "")
                {
                    //Dar de baja el usuario seleccionado
                    //Se obtiene el nro de funcionario de la fila seleccionada.
                    long nroFun = long.Parse(dgvActivos.Rows[e.RowIndex].Cells[2].Value.ToString());
                    //Se crea una nueva instancia de Persona, y se le asigna el usuario correspondiente al nro enviado.
                    Persona unaP = Sistema.getInstancia().getFuncEspecificoByNro(nroFun);
                    //Se deshabilita al funcionario.
                    unaP.deleteFuncionario();
                    //Recarga las listas para reflejar los cambios.
                    loadListasFunc();
                }
            }
        }

        private void dgvInactivos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0)
            {
                //Si esta seleccionado algun funcionario de la lista...
                if (dgvInactivos.Rows[e.RowIndex].Cells[1].Value.ToString() != "")
                {
                    //Cambiar 0 por el columnIndex de "Activar"
                    long nroFun = long.Parse(dgvInactivos.Rows[e.RowIndex].Cells[1].Value.ToString());
                    frmAcTipo fAcTipo = new frmAcTipo(nroFun); //pasar como parámetro un long que sea el nro de funcionario a activar
                    fAcTipo.Show();
                }
            }
        }

        private void frmGestion_Load(object sender, EventArgs e)
        {
            //Cargar listas de funcionarios.
            loadListasFunc();
        }

        public void loadListasFunc()
        {
            //Cargar lista de funcionarios Activos.
            dgvActivos.DataSource = Sistema.getInstancia().getListFuncByEstado(true);

            //Cargar lista de funcioarios Inactivos.
            dgvInactivos.DataSource = Sistema.getInstancia().getListFuncByEstado(false);
        }

        private void frmGestion_Activated(object sender, EventArgs e)
        {
            //cuando se le devuelve el foco a la ventana principal, esta dispara  este evento que recarga las listas de funcioarios
            //para reflejar los cambios realizados.
            loadListasFunc();
        }

        //Alta de un nuevo funcionario.
        private void button1_Click(object sender, EventArgs e)
        {
            //Si los datos ingresados en el formulario son validos...
            if (validarForm())
            {
                //Se intenta conseguir un funcionario ya existente con el Numero de funcionario asignado en el formulario.
                Persona unaP = Sistema.getInstancia().getFuncEspecificoByNro(long.Parse(txtNroFuncionario.Text));
                //Si el funcionario no existe...
                if (unaP == null)
                {
                    //Se crea una instancia de persona con el tipo de funcionario especifico de acuerdo a la seleccion del DDL "tipo de usuario".
                    unaP = Sistema.getInstancia().getTipoFuncByRol(cbTipo.SelectedItem.ToString());
                    //Se le asignan los valores del formulario a sus atributos.
                    unaP.NroFuncionario = long.Parse(txtNroFuncionario.Text);
                    unaP.Nombre = txtNombre.Text;
                    unaP.Apellido = txtApellido.Text;
                    unaP.Telefono = txtTel.Text;
                    unaP.Interno = txtInterno.Text;
                    unaP.Mail = txtMail.Text;
                    unaP.Seccion = txtSeccion.Text;
                    //Se inserta la nueva persona.
                    unaP.insert();
                    //Se recargan las listas para reflejar los cambios realizados.
                    loadListasFunc();
                    //Se limpia el formulario.
                    limpiarForm();
                    //Se avisa que el funcionario fue creado correctamente.
                    lblError.Text = "El funcionario fue añadido correctamente.";
                }
                else
                {
                    lblError.Text = "El numero de usuario ya ha sido utilizado por otro funcionario.";
                    limpiarForm();
                }
            }
        }

        private void cbTipo_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void txtNroFuncionario_KeyPress(object sender, KeyPressEventArgs e)
        {
            //Nos aseguramos que solo se puedan ingresar  numeros por teclado.
            if (Char.IsDigit(e.KeyChar))
            {
                e.Handled = false;
            }
            else
                if (Char.IsControl(e.KeyChar))
                {
                    e.Handled = false;
                }
                else
                    if (Char.IsSeparator(e.KeyChar))
                    {
                        e.Handled = false;
                    }
                    else
                    {
                        e.Handled = true;
                    }
        }
        public void limpiarForm()
        {
            txtNroFuncionario.Text = "";
            txtNombre.Text = "";
            txtApellido.Text = "";
            txtTel.Text = "";
            txtInterno.Text = "";
            txtMail.Text = "";
            txtSeccion.Text = "";
            cbTipo.SelectedIndex = -1;
        }
        public bool validarForm()
        {
            bool val = false;
            //Verifica que se haya ingresado un numero valido en el numero de funcionario.
            long nro = 0;
            long.TryParse(txtNroFuncionario.Text, out nro);
            if (nro > 0 && nro < 2100000000)
            {
                //Verifica que que se haya ingresado un nombre en un formato valido.
                nro = txtNombre.Text.Length;
                if (nro > 0 && nro < 30)
                {
                    //Verifica que que se haya ingresado un apellido en un formato valido.
                    nro = txtApellido.Text.Length;
                    if (nro > 0 && nro < 30)
                    {
                        //Verifica que que se haya ingresado un apellido en un formato valido.
                        nro = txtApellido.Text.Length;
                        if (nro > 0 && nro < 30)
                        {
                            //Verifica que que se haya ingresado un telefono en un formato valido.
                            nro = txtTel.Text.Length;
                            if (nro > 0 && nro < 30)
                            {
                                //Verifica que que se haya ingresado un interno en un formato valido.
                                nro = txtInterno.Text.Length;
                                if (nro > 0 && nro < 20)
                                {
                                    //Verifica que que se haya ingresado un email en un formato valido.
                                    nro = txtMail.Text.Length;
                                    if (nro > 0 && nro < 50 && validarEmail(txtMail.Text))
                                    {
                                        //Verifica que que se haya ingresado una seccion en un formato valido.
                                        nro = txtSeccion.Text.Length;
                                        if (nro > 0 && nro < 50)
                                        {
                                            //Verifica que se haya elegido un tipo correcto de funcionario en el combo box.
                                            string t = cbTipo.SelectedIndex == -1 ? "" : cbTipo.SelectedItem.ToString();
                                            if (t != "" && (t == "Usuario" || t == "Tecnico" || t == "Administrador" || t == "Supervisor"))
                                            {
                                                val = true;
                                            }
                                            else
                                            {
                                                lblError.Text = "Seleccione un tipo de usuario valido";
                                            }
                                        }
                                        else
                                        {
                                            lblError.Text = "Ingrese el nombre de una seccion menor de 50 caracteres.";
                                        }
                                    }
                                    else
                                    {
                                        lblError.Text = "Ingrese una direccion de email valida, que sea menor de 20 caracteres.";
                                    }
                                }
                                else
                                {
                                    lblError.Text = "Ingrese un interno menor de 20 caracteres.";
                                }
                            }
                            else
                            {
                                lblError.Text = "Ingrese un telefono menor de 30 caracteres.";
                            }
                        }
                        else
                        {
                            lblError.Text = "Ingrese un apellido menor de 30 caracteres.";
                        }
                    }
                    else
                    {
                        lblError.Text = "Ingrese un apellido menor de 30 caracteres.";
                    }
                }
                else
                {
                    lblError.Text = "Ingrese un nombre menor de 30 caracteres.";
                }
            }
            else
            {
                lblError.Text = "El numero de funcionario debe ser mayor a 0 y menor que 2.100.000.000.";
            }
            return val;
        }

        //Validar direcciones de correo electronico.
        private Boolean validarEmail(String pEmail)
        {
            String expresion;
            expresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
            if (Regex.IsMatch(pEmail, expresion))
            {
                if (Regex.Replace(pEmail, expresion, String.Empty).Length == 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        private void txtNombre_KeyPress(object sender, KeyPressEventArgs e)
        {
            //Nos aseguramos que solo se pueda ingresar texto por teclado en este campo.
            if (Char.IsLetter(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void txtApellido_KeyPress(object sender, KeyPressEventArgs e)
        {
            //Nos aseguramos que solo se pueda ingresar texto por teclado en este campo.
            if (Char.IsLetter(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void txtTel_KeyPress(object sender, KeyPressEventArgs e)
        {
            //Nos aseguramos que solo se puedan ingresar  numeros por teclado.
            if (Char.IsDigit(e.KeyChar))
            {
                e.Handled = false;
            }
            else
                if (Char.IsControl(e.KeyChar))
                {
                    e.Handled = false;
                }
                else
                    if (Char.IsSeparator(e.KeyChar))
                    {
                        e.Handled = false;
                    }
                    else
                    {
                        e.Handled = true;
                    }
        }

        private void txtInterno_KeyPress(object sender, KeyPressEventArgs e)
        {
            //Nos aseguramos que solo se puedan ingresar  numeros por teclado.
            if (Char.IsDigit(e.KeyChar))
            {
                e.Handled = false;
            }
            else
                if (Char.IsControl(e.KeyChar))
                {
                    e.Handled = false;
                }
                else
                    if (Char.IsSeparator(e.KeyChar))
                    {
                        e.Handled = false;
                    }
                    else
                    {
                        e.Handled = true;
                    }
        }
    }

}
